package com.zrrd.thread._03_implCallable;

import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

/**
 * @author WanJl
 * @version 1.0
 * @title MyCallable
 * @description
 * @create 2023/10/29 11:04
 */
//1、定义一个类MyCallable实现Callable接口，并且可以指定泛型
public class MyCallable implements Callable<String> {
    //2、在MyCallable类中重写call()方法，指定了哪种类型的泛型，该方法返回值类型就是哪种类型。
    @Override
    public String call() throws Exception {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入第1个数值：");
        int n1 = sc.nextInt();
        System.out.println("请输入第2个数值：");
        int n2 = sc.nextInt();

        return "计算结果为："+(n1+n2);
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //3、创建MyCallable类的对象
        MyCallable mc = new MyCallable();
        //Thread t1=new Thread(mc);
        //4、创建Future的实现类FutureTask对象，把MyCallable对象作为构造方法的参数
        //FutureTask<String>的泛型要和MyCallable的泛型一致
        FutureTask<String> ft=new FutureTask<>(mc);
        //5、创建Thread类的对象，把FutureTask对象作为构造方法的参数
        Thread t1=new Thread(ft);
        //6、启动线程
        t1.start();
        //7、再调用get方法，就可以获取线程结束之后的结果。
        String s = ft.get();
        System.out.println(s);
    }
}
